home *** CD-ROM | disk | FTP | other *** search
- ;gaithersburg md pc bb 19 mar 83
- ;Updated: 05/01/82. 8463 Bytes. Xmit Time: 4:42
- ;
- TITLE NWS - ASSEMBLER PROGRAM TO STRIP HI-ORDER BITS FROM WORDSTAR FILES
- SUBTTL DESCRIPTION OF THE STACK SEGMENT
- PAGE
- STACK SEGMENT PARA STACK 'STACK'
- DB 64 DUP('STACK ')
- STACK ENDS
- SUBTTL DESCRIPTION OF THE DATA SEGMENT
- PAGE
- WORKAREA SEGMENT PARA PUBLIC 'DATA'
- LOGO DB ' ***********************************************************************',10,13
- db ' * *',10,13
- db ' * UN - Wordstar *',10,13
- db ' * A program to remove the high-order bits from Wordstar data *',10,13
- db ' * files. You are prompted for the input and output file names. *',10,13
- db ' * *',10,13
- db ' * Written as an assembler language example by Gene Plantz *',10,13
- db ' ***********************************************************************',10,10,10,10,13,'$'
- donem db '--------> DONE <-------------',10,13,'$'
- eofflag db 0
- crlf db 10,13,'$' ;issue carriage return-linefeed after input
- fcb1 db 40 dup(0) ;input file only needs to be 36 (but safe)
- fcb2 db 40 dup(0) ;file control block for output
- err0 db 7,7,'---> ERROR Opening INPUT file <--------',10,13,'$'
- err1 db 7,7,'---> ERROR.. not enough disk space for output <---',10,13,'$'
- err2 db 7,7,'---> ERROR.... bad file name given. <----',10,13,'$'
- parms db 14 ;max size of reply
- repson db ? ;size of what they typed
- name1 db 20 dup(' ') ;this is where the users reply goes
- parms2 db 14 ;max size of input
- resp2 db ? ;size of what they really typed in
- name2 db 20 dup(' ') ;this is where the reply goes
- ask1 db 10,10,13,'Please Enter the name of the input file $'
- ask2 db 'Please Enter the name of the output file $'
- buffer db 128 dup(' ') ;record buffer
- workarea ends
- ;
- subttl desciption of dos interfaces
- cseg segment para public 'CODE'
- start proc far
- assume cs:cseg,ds:workarea,ss:stack,es:workarea
- org 100h
- push ds ;set up starting linkage as per dxample
- sub ax,ax ;zero this and place on stack
- push ax ;so that when we do a RET we go to
- mov ax,workarea ;location 0; point to our workarea
- mov ds,ax ;move the workarea address into DS
- mov es,ax ;also into ES for the function 29H
- call cls ;call subroutine to clear the screen
- mov dh,3 ;set cursor to row 8
- mov dl,0 ;set cursor to column 0
- mov bh,0 ;use screen number 0
- mov ah,2 ;function 2 to locate cursor
- int 10h ; go do it
- mov dx,offset logo ;display the logo where we put cursor
- mov ah,9 ;function 9 is print string
- int 21h ;call dos to do it
- ;
- mov dx,offset ask1 ;point to message to display
- mov ah,9 ;tell DOS what function (print string)
- int 21h ;call DOS
- ;
- mov dx,offset parms ;point to console input buffer
- mov ah,10 ;read console buffer
- int 21h ;do it
- ;
- mov si,offset name1 ;put address of name1 into SI
- mov di,offset fcb1 ;put address of file control block DI
- mov ah,29h ;tell DOS to parse filename
- int 21h ;do it
- ;
- mov dx,offset crlf ;do a carriage return-line feed
- mov ah,9 ;after the reply
- int 21h ;to DOS
- ;
- mov al,[di+1] ;if DI+1 = blank, no file name
- cmp al,20h ;if blank, error
- jnz isok
- jmp error2
- ;
- isok:
- mov dx,offset ask2 ;ask user for name of new file
- mov ah,9 ;display question
- int 21h ;DOS
- ;
- mov dx,offset parms2 ;put address of input buffer into DX
- mov ah,10 ;get input from user
- int 21h ;DOS
- ;
- mov dx,offset crlf ;another cr,lf
- mov ah,9
- int 21h
- ;
- mov si,offset name2 ;SI = address of field NAME2
- mov di,offset fcb2 ;DI = address of second file control
- mov ah,29h ;ask DOS to parse filename
- int 21h ;DOS
- ;
- mov al,[di+1] ;if DI+1 = blank, error
- cmp al,20h ;is it blank??
- jz error2 ;tell him and leave yyyyy
- ;
- mov dx,offset fcb1 ;point to first fcb
- mov ah,15 ;open the input file
- int 21h ;call dos to do it
- ;
- cmp al,0 ;see if ok
- jnz error0 ;tell him and leave
- ;
- mov dx,offset fcb2 ;address of fcb2
- mov ah,16h ;create out put file
- int 21h ;this does open, too
- ;
- mov dx,offset buffer ;point to out record buffer
- mov ah,1ah ;tell DOS to put disk data there
- int 21h ;DOS
- ;
- readl: cmp eofflag,1 ;see if end-of-file was reached
- jz closeall ;yes, wrap it up and leave
- mov dx,offset fcb1 ;read from file 1
- mov ah,14h ;sequential read from disk
- int 21h ;DOS
- ;
- cmp al,0 ;see if normal return
- jz readok ;if zero, ok
- mov eofflag,1 ;error or eof, set end-of-file flag
- cmp al,03 ;see if eof and data too
- jz readok ;if 03 we have both
- jmp readl ;back to read
- ;
- readok:
- mov cx,128 ;size of logical record
- mov si,offset buffer ;SI = address of our buffer
- andloop:
- ;these 3 lines were used because
- ; AND [SI],7FH wouldn't assemble
- ;
- mov al,[si] ;and out the hi-bit
- and al,7fh
- mov [si],al ;put it back
- ;
- inc si ;bump pointer to next char in buffer
- loop andloop ;do it 128 times (in CX)
- ;
- mov dx,offset fcb2 ;point to output fcb
- mov ah,15h ;sequential write
- int 21h
- cmp al,1 ;this means disk full
- jz error1
- ;
- jmp readl ;do it again
- ;
- closeall:
- mov dx,offset fcb2 ;close output file
- mov ah,10h
- int 21h
- ;
- mov dx,offset donem ;iisue DONE message
- mov ah,9
- int 21h
- jmp exit
- ;
- error2: mov dx,offset err2 ;err mess 2
- jmp errorm
- error1: mov dx,offset err1 ;point to error mess number 1
- jmp errorm
- error0: mov dx,offset err0
- errorm:
- mov ah,9 ;print it
- int 21h
- jmp closeall
- exit: ret
- start endp
- ;
- ;
- subttl clear screen routine
- cls proc near
- mov cx,0
- mov dx,2479h
- mov bh,7
- mov ax,600h
- int 10h
- ret
- cls endp
- ;
- ;
- cseg ends
- end start